package com.itlaobing.parse;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Enumeration;
/*
理解HTTP请求的构成并通过HttpServletRequest 实例中 获取 HTTP 请求 中数据
 */
@WebServlet(name = "parseRequestServlet" , urlPatterns = { "/parse/request/*" , "/parse/req/*" , "/parse-req/*" })
public class ParseRequestServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // 从 HttpServletRequest 实例中 获取 HTTP 请求 中 请求行(request line) 所包含的数据
        String actionName = request.getMethod(); // 获得请求方式(也称作HTTP动作名称)
        String uri = request.getRequestURI() ; // 获取本次HTTP请求所访问的路径( URI : Uniform Resource Identifier , 统一资源标识符 )
        String protocol = request.getProtocol(); // 获得协议
        System.out.println( actionName + " " + uri + " " + protocol );

        // 从 HttpServletRequest 实例中 获取 HTTP 请求 中 请求头(request header) 所包含的数据
        Enumeration<String> headname = request.getHeaderNames();// 获得所有的 请求头 字段名称 组成的 Enumeration 对象
        while (headname.hasMoreElements()){
            String name = headname.nextElement();
            String value = request.getHeader(name);
            System.out.println( name + ":" + value );
        }

        System.out.println(); //CRLF  单独输出一个空行表示 HTTP请求中的空行

        // 从 HttpServletRequest 实例中 获取 HTTP请求 中 实体数据
        BufferedReader br = request.getReader(); // 获得一个字符输入流，以便于通过字符流读取正文数据
        String s ;
        while ((s = br.readLine()) != null){
            System.out.println(s);
        }

        /*
         * get 不会将地址栏中的信息当作 正文输出
         * post则会
         */
        // QueryString 查询字符串
        System.out.println( "以下仅用于获取 queryString ，不属于请求正文:" );
        String query = request.getQueryString();
        System.out.println(query);


    }
}
